import nodemailer from 'nodemailer';
import { getLogger } from '@/utils/logger';
import monitorConfig from '@/config/monitor';
import { monitorEvents } from './metric.service';

// 创建常规日志记录器（不输出到控制台）
const logger = getLogger('alert-service', {
  console: false
});
// 创建控制台日志记录器
const consoleLogger = getLogger('alert-service');
// 创建专门的告警日志记录器
const alertLogger  = getLogger('系统监控告警', {
  console: false,
  singleFile: true,
  errorFile: false
});

interface AlertEvent {
  type: string;
  message: string;
  data: any;
  timestamp: number;
}

/**
 * 告警服务
 * 负责处理系统监控告警并发送通知
 */
class AlertService {
  // 邮件发送器
  private mailer: nodemailer.Transporter | null = null;
  
  constructor() {
    try {
      if (monitorConfig.alert.enabled) {
        this.initAlertHandlers();
        this.initMailer();
        consoleLogger.info('告警服务已初始化');
      } else {
        consoleLogger.info('告警服务已禁用');
      }
    } catch (error) {
      consoleLogger.error(`初始化告警服务失败: ${error instanceof Error ? error.message : String(error)}`);
      throw new Error('初始化告警服务失败');
    }
  }
  
  /**
   * 初始化告警处理器
   */
  private initAlertHandlers(): void {
    try {
      logger.debug('初始化告警事件处理器');
      
      monitorEvents.on('alert', (event: AlertEvent) => {
        this.handleAlert(event);
      });
      
      logger.info('告警事件处理器初始化完成');
    } catch (error) {
      consoleLogger.error(`初始化告警处理器失败: ${error instanceof Error ? error.message : String(error)}`);
    }
  }
  
  /**
   * 初始化邮件发送器
   */
  private initMailer(): void {
    try {
      if (!monitorConfig.alert.email.enabled) {
        logger.info('邮件通知服务已禁用');
        return;
      }
      
      logger.debug('初始化邮件发送器');
      
      this.mailer = nodemailer.createTransport({
        host: monitorConfig.alert.email.host,
        port: monitorConfig.alert.email.port,
        secure: monitorConfig.alert.email.secure,
        auth: {
          user: monitorConfig.alert.email.auth.user,
          pass: monitorConfig.alert.email.auth.pass
        }
      });
      
      // 验证邮件配置
      this.mailer.verify((error) => {
        if (error) {
          consoleLogger.error(`邮件通知配置有误: ${error instanceof Error ? error.message : String(error)}`);
          this.mailer = null;
        } else {
          consoleLogger.info('邮件通知服务已准备就绪');
          logger.info('邮件通知服务验证成功，已准备就绪');
        }
      });
    } catch (error) {
      consoleLogger.error(`初始化邮件通知服务失败: ${error instanceof Error ? error.message : String(error)}`);
      this.mailer = null;
    }
  }
  
  /**
   * 处理告警事件
   * @param event 告警事件对象
   */
  private async handleAlert(event: AlertEvent): Promise<void> {
    try {
      consoleLogger.info(`处理告警事件: 类型=${event.type}, 消息=${event.message}`);
      
      // 记录告警到专门的日志文件
      await this.saveAlertToDatabase(event);
      
      // 发送邮件通知
      if (monitorConfig.alert.email.enabled && this.mailer) {
        await this.sendEmailAlert(event);
      }
      
      // 这里可以添加其他通知渠道，如钉钉、企业微信等
      logger.info(`告警事件处理完成: 类型=${event.type}`);
    } catch (error) {
      consoleLogger.error(`处理告警事件失败: ${error instanceof Error ? error.message : String(error)}`);
    }
  }
  
  /**
   * 保存告警记录到专门的日志文件
   * @param event 告警事件对象
   */
  private async saveAlertToDatabase(event: AlertEvent): Promise<void> {
    try {
      logger.debug(`保存告警记录: 类型=${event.type}, 消息=${event.message}`);
      
      // 格式化告警时间
      const date = new Date(event.timestamp).toLocaleString('zh-CN');
      
      // 创建结构化的告警日志记录
      const alertRecord = {
        alertTime: date,
        alertType: event.type,
        alertMessage: event.message,
        alertData: event.data,
        timestamp: event.timestamp,
      };
      
      // 保存到专门的告警日志
      alertLogger.warn("系统告警", alertRecord);
      logger.info(`已保存系统告警日志: 类型=${event.type}, 消息=${event.message}`);
    } catch (error) {
      consoleLogger.error(`保存告警记录失败: ${error instanceof Error ? error.message : String(error)}`);
    }
  }
  
  /**
   * 发送邮件告警
   * @param event 告警事件对象
   */
  private async sendEmailAlert(event: AlertEvent): Promise<void> {
    try {
      if (!this.mailer) {
        consoleLogger.warn('邮件发送器未初始化，无法发送告警邮件');
        return;
      }
      
      logger.debug(`准备发送告警邮件: 类型=${event.type}, 消息=${event.message}`);
      
      const date = new Date(event.timestamp).toLocaleString('zh-CN');
      
      const mailOptions = {
        from: monitorConfig.alert.email.from,
        to: monitorConfig.alert.email.to.join(","),
        subject: `【系统告警】${event.message}`,
        html: `
          <h2>系统告警通知</h2>
          <p><strong>告警时间:</strong> ${date}</p>
          <p><strong>告警类型:</strong> ${event.type}</p>
          <p><strong>告警内容:</strong> ${event.message}</p>
          <h3>详细信息:</h3>
          <pre>${JSON.stringify(event.data, null, 2)}</pre>
        `,
      };
      
      await this.mailer.sendMail(mailOptions);
      logger.info(`告警邮件已发送: 接收者=${monitorConfig.alert.email.to.join(',')}, 类型=${event.type}`);
    } catch (error) {
      consoleLogger.error(`发送告警邮件失败: ${error instanceof Error ? error.message : String(error)}`);
    }
  }
}

export default new AlertService(); 